package fr.bludwarf.skywarrior.joueur;

import java.lang.reflect.Field;

import fr.bludwarf.skywarrior.exceptions.UniteInconnueException;
import fr.bludwarf.skywarrior.global.ElementNomme;
import fr.bludwarf.skywarrior.ile.Batiment;
import fr.bludwarf.skywarrior.ile.StatsCombat;

/**
 * Unité comme l'Apicopter ou l'Atlas par exemple
 * @since 15 nov. 2011
 */
public abstract class Unite implements ElementNomme
{
	
	/** Nom de l'unité */
	private final String _nom;
	
	/** Durée de construction de base de l'unité (en secondes) */
	private final double _duree;
	
	/** Compétence pour le combat de l'unité */
	private final StatsCombat _combat;
	
	/** Coût de l'unité (matériaux, éther et population consommés) */
	private Ressources _cout;
	
	/** Population nécessaire */
	private int _pop;

	private final int _score;

	public Unite(String nom, double duree, StatsCombat combat, Ressources cout, final int pop, final int score) {
		_nom = nom;
		_duree = duree;
		_combat = combat;
		_cout = cout;
		_pop = pop;
		_score = score;
	}

	public Unite(String nom, double duree, StatsCombat combat, Ressources cout, final int pop) {
		this(nom, duree, combat, cout, pop, 0);
	}

	/**
	 * @return Durée de construction de base de l'unité (en secondes)
	 */
	public double getDuree() {
		return _duree;
	}

	/**
	 * @return le coût de construction de cette unité
	 */
	public Ressources getCout() {
		return _cout;
	}

	/**
	 * @return Population nécessaire
	 */
	public int getPop() {
		return _pop;
	}

	/**
	 * @return Compétence pour le combat de l'unité
	 */
	public StatsCombat getStatsCombat() {
		return _combat;
	}
	
	@Override
	public String toString() {
		return _nom;
	}

	/**
	 * @return nombre de points gagnés quand on a construit cette unité
	 */
	public int getPoints()
	{
		return 0;
	}

	public int getScore()
	{
		return _score;
	}

	public static Unite getUnite(String nom) throws UniteInconnueException
	{		
		try
		{
			// Batiment ?
			for (final Field field : Batiment.class.getDeclaredFields())
			{
				if (field.getName().equalsIgnoreCase(nom)) return (Batiment) field.get(Batiment.class);
			}
			// Unité ?
			for (final Field field : Vaisseau.class.getDeclaredFields())
			{
				if (field.getName().equalsIgnoreCase(nom)) return (Vaisseau) field.get(Vaisseau.class);
			}
			throw new UniteInconnueException("Impossible de trouver le bâtiment ou le vaisseau nommé : " + nom);
		}
		
		catch (IllegalArgumentException e)
		{
			throw new UniteInconnueException("Le bâtiment ou le vaisseau nommé : " + nom + " a été trouvé mais une erreur de réflexion Java est survenue", e);
		}
		
		catch (IllegalAccessException e)
		{
			throw new UniteInconnueException("Le bâtiment ou le vaisseau nommé : " + nom + " a été trouvé mais une erreur de réflexion Java est survenue", e);
		}
		
	}
	
	public String getNom()
	{
		return _nom;
	}

}
